<?php
/**
 * 动态平台 memcache
 * 新申请的PHP5空间环境变量不同，请使用本函数
 * 
 * @package Helper
 * @Author: Ziming <ziming@staff.sina.com.cn,jorygong@gmail.com>
 * 			Chengxuan <chengxuan@leju.sina.com.cn>
 * 
 * @@@@@ By Deepseath 2008-12-11 1:16:58
 * @@@@@ 不使用共享memcache只有一台memcache
 * @@@@@ By Chengxuan 加入init方法，确定只有一个对象实例
 */

!defined('MEM_CACHE_KEY_PREFIX') && define('MEM_CACHE_KEY_PREFIX',$_SERVER["SINASRV_MEMCACHED_KEY_PREFIX"]); //定义memcache的key前缀


final class Cls_Mc {

	/**
	 * @var Memcache
	 */
	static public $mc;
	
	/**
	 * 初始化对象，返回一个Cls_Mc操作对象
	 * @return Cls_Mc
	 */
	static public function init() {
		static $object=null;
		!$object && $object = new self;
		return $object;
	}

	/**
	 * 构造方法
	 */
	protected function __construct() {
		if(!self::$mc)
		{
			self::$mc = new Memcache;
			$v = explode(':',trim($_SERVER['SINASRV_MEMCACHED_SERVERS']));
			if (@self::$mc->connect($v[0],$v[1])){
				if (!defined('SINAHOUSE_MEMCACHE_ENABLE'))define('SINAHOUSE_MEMCACHE_ENABLE',1);
			}
		}
	}
	
	/**
	 * 取得缓存数据
	 * @param string	$key		缓存键名
	 * @param int		$lifetime	缓存有效期
	 * @return mixed	成功返回数据，失败返回false
	 */
	public function get_cache($key,$lifetime){
		if (!defined('SINAHOUSE_MEMCACHE_ENABLE'))Return false;
		$key=MEM_CACHE_KEY_PREFIX.'sina'.$key;
		if($data = self::$mc->get($key)){
			//$data	=	unserialize($data);
			$lifetime=intval($lifetime)/10*rand(9,15)+rand(0,5);//访问频率越高，越接近真实$lifetime
			if($lifetime<2&&$lifetime>=0)$lifetime=2;
			if(!empty($data['updatetime']) && (time()-$data['updatetime'] < $lifetime) ){
				Return $data['data'];
			}
		}
		Return false;
	}
	
	/**
	 * 设置缓存数据 
	 * @param int	$key		缓存键名
	 * @param mixed	$data		缓存数据内容
	 * @param int	$lifetime	缓存有效期
	 */
	function set_cache($key,$data,$lifetime){
		if (!defined('SINAHOUSE_MEMCACHE_ENABLE'))Return false;
		$key=MEM_CACHE_KEY_PREFIX.'sina'.$key;
		$lifetime_r=$lifetime*2+120;//
		$mdata['updatetime']=time();
		$mdata['data']=$data;
		self::$mc->set($key,$mdata,0,$lifetime_r);
	}

	/**
	 * 清缓存
	 * @param string $key	缓存键名
	 */
	function delete_cache($key){
		if (!defined('SINAHOUSE_MEMCACHE_ENABLE'))Return false;
		$key=MEM_CACHE_KEY_PREFIX.'sina'.$key;
		self::$mc->delete($key);
	}





	/**
	 * 设置锁
	 * @param string	$key		缓存键名
	 * @param int		$lifetime	缓存有效期
	 */
	public function set_lock($key,$lifetime){
		if (!defined('SINAHOUSE_MEMCACHE_ENABLE'))Return false;
		$key=MEM_CACHE_KEY_PREFIX.'_lock_'.$key;
		self::$mc->set($key,1,0,$lifetime);
	}

	/**
	 * 是否被锁
	 * @param string $key	缓存键名
	 * @return boolean		锁 true，未被锁 false
	 */
	public function is_lock($key){
		if (!defined('SINAHOUSE_MEMCACHE_ENABLE'))Return false;
		$key=MEM_CACHE_KEY_PREFIX.'_lock_'.$key;
		if(self::$mc->get($key))return true;
		Return false;
	}

	/**
	 * 释放锁
	 * @param string $key	缓存键名
	 */
	public function delete_lock($key){
		if (!defined('SINAHOUSE_MEMCACHE_ENABLE'))Return false;
		$key=MEM_CACHE_KEY_PREFIX.'_lock_'.$key;
		self::$mc->delete($key);
	}




}
